//3 5 7 -1 -1 2  4
const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let initArr = [];
rl.on("line", (line)=>{
    if(initArr.length === 0) {
        initArr =  line.trim().split(/\s+/).map(Number)
        console.log(getResult(initArr))
        // clear
        initArr.length = 0
    }

})

// 根在0或者1, 只不过是不同的左右子孩子的算法罢了
// 我们按照题目中的说法来做吧
function getResult(initArr) {
    initArr.unshift(0)
    let ans = []
    dfs(initArr, 1, [initArr[1]], ans)

    let ansIndex = 0
    for (let i = 1; i < ans.length ; i++) {
        if(ans[ansIndex].at(-1) > ans[i].at(-1)) {
            ansIndex = i
        }
    }

    return ans[ansIndex].join(" ")


}

function dfs(initArr, rootIndex, path, ans) {
   // 左右孩子处理
    let l = 2 * rootIndex
    let r = 2 * rootIndex + 1
    if(l >= initArr.length && r >= initArr.length) {
        ans.push([...path])
        return
    }
    if(initArr[l] === -1 && initArr[r] === -1) {
        ans.push([...path])
        return
    }

    if(l < initArr.length && initArr[l] !== -1) {
        dfs(initArr, l, [...path, initArr[l]], ans)
    }
    if(r < initArr.length && initArr[r] !== -1) {
        dfs(initArr, r, [...path, initArr[r]], ans)
    }
}